package cn.tedu.charging.device.startup;


import cn.tedu.charging.device.dao.repository.StationCacheRepository;
import cn.tedu.charging.device.dao.repository.StationCacheRepositoryFactory;
import cn.tedu.charging.device.dao.repository.StationRepository;
import cn.tedu.charging.device.pojo.po.StationPO;
import cn.tedu.charging.device.service.DeviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;

@Slf4j
@Component
public class StationDataInit implements ApplicationRunner {

    /**
     * 理解Bean的生命周期
     * https://blog.csdn.net/weixin_40382222/article/details/140338443
     * 实例化（Instantiation）
     * 填充属性（Populate Properties）
     * BeanNameAware设置（BeanNameAware set）
     * BeanFactoryAware设置（BeanFactoryAware set）
     * 前置初始化（Post Process Before Initialization）
     * 初始化（Initialization）
     * 后置初始化（Post Process After Initialization）
     * 销毁（Destroy）
     *
     * Bean初始化完成后被执行
     */
    @PostConstruct
    public void init() {
        log.info("StationDataInit.init 被调用了");
    }

    //@Autowired
    //private StationRepository stationRepository;

    //@Autowired
    //private StationCacheRepositoryFactory factory;

    @Autowired
    private DeviceService deviceService;


    /**
     * https://blog.csdn.net/m0_46459413/article/details/132322256
     * spring容器启动完成之后，就会紧接着执行这个接口实现类的run方法。
     * @param args
     * @throws Exception
     */
    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.debug("StationDataInit#run 被调用了");

        log.debug("缓存预热 在项目启动的时候，从数据库查询场站信息");
        //为了避免场站信息数据量过大，导致设备服务内存溢出
        //从数据库通过 分页 查询所有场站信息，limit 1，100
        List<StationPO> allStations = deviceService.getAllStationsFromDB();
        log.debug("缓存预热 查询到场站信息:{}",allStations);

        log.debug("缓存预热 将场站信息保存到Redis中");
        deviceService.saveAllStations2Cache(allStations);
        log.debug("缓存预热 缓存预热完成");

    }
}
